package com.foton.designmodel.share.aspect;


import com.foton.designmodel.share.session.UserThreadLocal;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


/**
 * 记录用户行为日志记录
 */
@Aspect
@Slf4j
@Component
public class LogAspect {

    @Autowired
    private UserThreadLocal userThreadLocal;


    /**
     * aop:五种模式
     * 前置通知：在方法调用之前进行执行
     * 后置通知：在方法调用后进行执行
     * 环绕通知：在方法调用之前或者之后，都分别可以执行的通知
     * 异常通知：如果在方法调用时，出现异常则进行通知
     * 最终通知：在方法调用之后进行执行（类似final）
     */

    /**
     * 切面类表达式：
     * execution:要执行的表达式主体
     * 第一处 * 代表返回值类型，* 代表所有类型
     * 第二处 包名 aop监控包下所有的类
     * 第三处 .. 代表该包以及其子包，下的所有的类和方法
     * 第四处 * 代表类名，* 代表所有类
     * 第五处 *(..)  *代表方法名称，（..）代表方法的参数
     *
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @SneakyThrows
    @Before("execution(* com.fonton.controller..*.*(..))")
    public void logRecode(JoinPoint joinPoint){
        //获取方法名字和参数
        String methodName = joinPoint.getTarget().getClass().getName()+"."+joinPoint.getSignature().getName();//记录日志
        log.info("用户【"+userThreadLocal.get().toString()+"】访问:"+methodName) ;
    }


}
